﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#include "GcmpGUiBaseInterface.h"

namespace gcmp
{
    /// \brief 校验器
    ///
    class GCMP_GUI_BASE_INTERFACE_EXPORT IGUiValidator
    {
    public:
        /// \brief 析构函数
        ///
        virtual ~IGUiValidator();

        /// \brief  获取提示
        ///
        /// \return 提示
        /// \note   默认子类中根据数据生成统一格式的提示；如果要自定义提示，则需要设置
        virtual std::wstring GetTooltip() const = 0;

        /// \brief 设置提示
        /// 
        /// \param tooltip 提示
        /// \return true：设置成功，false：设置失败
        virtual bool SetTooltip(const std::wstring& tooltip) = 0;

        /// \brief  验证输入的字符串
        ///
        /// \param  input 输入的字符串
        /// \return true：输入合法；false：输入不合法
        virtual bool ValidateInput(const std::wstring& input) const = 0;

    public:
        /// \brief 创建默认的数值（double类型）校验器
        ///
        /// 其最小值为负无穷，最大值为正无穷，小数点后的最大位数为3
        /// \return 创建的IGUiValidator对象
        static OwnerPtr<IGUiValidator> CreateNumberValidator();

        /// \brief 创建数值（double类型）校验器
        ///
        /// \param minimum 最小值
        /// \param maximum 最大值
        /// \param decimals 小数点后的最大位数，默认值3
        /// \param tooltip 提示
        /// \param isIncludeMinimum 是否包括最小值，true：包括，false：不包括，默认为true
        /// \param isIncludeMaximum 是否包括最大值，true：包括，false：不包括，默认为true
        /// \return 创建的IGUiValidator对象
        static OwnerPtr<IGUiValidator> CreateNumberValidator(double minimum, double maximum, int decimals = 3, const std::wstring& tooltip = L"", bool isIncludeMinimum = true, bool isIncludeMaximum = true);

        /// \brief 创建默认的序列校验器
        ///
        /// 以逗号分隔的整数序列，不能重复，无排序要求
        /// 元素的最小值为负无穷，最大值为正无穷，元素个数最少为1，最大为正无穷
        /// \return 创建的IGUiValidator对象
        static OwnerPtr<IGUiValidator> CreateSequenceValidator();

        /// \brief 创建序列校验器
        ///
        /// 以逗号分隔的整数序列，不能重复，无排序要求
        /// \param minimum 序列中每个元素的最小值
        /// \param maximum 序列中每个元素的最大值
        /// \param minCount 序列的元素个数的最小值，要求最小为1
        /// \param maxCount 序列的元素个数的最大值
        /// \param tooltip 提示
        /// \return 创建的IGUiValidator对象
        static OwnerPtr<IGUiValidator> CreateSequenceValidator(int minimum, int maximum, int minCount, int maxCount, const std::wstring& tooltip = L"");

        /// \brief 创建集合校验器
        ///
        /// \param collection 验证的集合，集合中的元素类型为double，精度为1E-6
        /// \param tooltip 提示
        /// \return 创建的IGUiValidator对象
        static OwnerPtr<IGUiValidator> CreateCollectionValidator(const std::set<double>& collection, const std::wstring& tooltip = L"");
    };
}
